Skip to content

Conversation

MaEtUgR
Copy link
Member

@MaEtUgR MaEtUgR commented Jun 4, 2025

Solved Problem

Related to #24960 when trying to track the serial number of Tattu UAVCAN batteries, we found that they only provide this information in a separate cuav::equipment::power::CBAT message.

Closes #24088

Solution

Add parsing for said message while stopping to pars the other UAVCAN battery information messages for any instance that provides CBAT because it contains a superset of the battery fields.

Changelog Entry

Support for CBAT uavcan message parsing

Test coverage

This kind of battery is the main way I'm testing the latest version of #24960 (comment) so please see there for results and screenshot.

@MaEtUgR MaEtUgR self-assigned this Jun 4, 2025
@MaEtUgR MaEtUgR force-pushed the maetugr/battery-info branch 2 times, most recently from e584afa to d6cf5a4 Compare June 11, 2025 09:23
@MaEtUgR MaEtUgR force-pushed the maetugr/cbat branch 2 times, most recently from bec51bf to 31862fd Compare June 11, 2025 11:23
@MaEtUgR MaEtUgR force-pushed the maetugr/battery-info branch 3 times, most recently from 3c3889c to 32d5e4c Compare June 12, 2025 15:32
@MaEtUgR MaEtUgR force-pushed the maetugr/battery-info branch from 32d5e4c to 0398d13 Compare June 12, 2025 15:56
@MaEtUgR MaEtUgR force-pushed the maetugr/battery-info branch from 0398d13 to 046eb10 Compare June 16, 2025 17:26
Base automatically changed from maetugr/battery-info to main June 17, 2025 07:05
@MaEtUgR MaEtUgR marked this pull request as ready for review June 24, 2025 12:13
@MaEtUgR
Copy link
Member Author

MaEtUgR commented Jun 24, 2025

Now that #24960 was merged I rebased these two commits and they are ready for review.

@MaEtUgR MaEtUgR requested a review from sfuhrer June 24, 2025 12:15
Copy link

github-actions bot commented Jun 24, 2025

🔎 FLASH Analysis

px4_fmu-v5x [Total VM Diff: 2200 byte (0.1 %)]
    FILE SIZE        VM SIZE    
--------------  -------------- 
+0.1% +2.09Ki  +0.1% +2.09Ki    .text
  [NEW]    +656  [NEW]    +656    UavcanBatteryBridge::cbat_sub_cb()
   +14%    +640   +14%    +640    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.8%    +136  +2.8%    +136    uavcan::GenericSubscriber<>::checkInit()
  +1.6%    +128  +1.6%    +128    uavcan::GlobalDataTypeRegistry::registerDataType<>()
   +30%     +84   +30%     +84    UavcanBatteryBridge::init()
 -97.7%     +66 -97.7%     +66    [7 Others]
  +3.3%     +56  +3.3%     +56    uavcan::Subscriber<>::handleReceivedDataStruct()
  +2.2%     +54  +2.2%     +54    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +2.8%     +40  +2.8%     +40    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +3.2%     +38  +3.2%     +38    uavcan::Subscriber<>::~Subscriber()
  +7.8%     +36  +7.8%     +36    UavcanBatteryBridge::UavcanBatteryBridge()
  +0.0%     +36  +0.0%     +36    [section .text]
  +6.7%     +32  +6.7%     +32    uavcan::ScalarCodec::decode<>()
  +5.2%     +28  +5.2%     +28    uavcan::FloatSpec<>::decode()
  +2.7%     +24  +2.7%     +24    uavcan::GenericSubscriber<>::TransferForwarder
  +2.1%     +24  +2.1%     +24    uavcan::MethodBinder<>::operator bool()
  +6.8%     +20  +6.8%     +20    UavcanBatteryBridge::battery_aux_sub_cb()
  +0.0%     +20  +0.0%     +20    g_cromfs_image
  +2.7%     +20  +2.7%     +20    uavcan::GenericSubscriber<>
  +3.3%     +20  +3.3%     +20    uavcan::Subscriber<>
 -10.1%     -22 -10.1%     -22    uavcan::equipment::power::BatteryInfo_<>::decode()
[ = ]       0  +0.1%     +64    .bss
  [ = ]       0  +1.9%     +40    uavcan::GlobalDataTypeRegistry::registerDataType<>()::entry
  [ = ]       0   +52%     +27    [section .bss]
  [ = ]       0 -75.0%      -3    _bidirectional
+0.0%     +74  [ = ]       0    .debug_abbrev
+0.1%    +144  [ = ]       0    .debug_aranges
+0.1%    +536  [ = ]       0    .debug_frame
+0.1% +23.2Ki  [ = ]       0    .debug_info
+0.1% +4.22Ki  [ = ]       0    .debug_line
   +25%      +1  [ = ]       0    [Unmapped]
  +0.1% +4.22Ki  [ = ]       0    [section .debug_line]
+0.1% +5.31Ki  [ = ]       0    .debug_loclists
+0.1%    +806  [ = ]       0    .debug_rnglists
  [DEL]      -2  [ = ]       0    [Unmapped]
  +0.1%    +808  [ = ]       0    [section .debug_rnglists]
+0.5% +18.5Ki  [ = ]       0    .debug_str
+0.4%      +1  [ = ]       0    .shstrtab
+0.4% +2.64Ki  [ = ]       0    .strtab
  [NEW]    +110  [ = ]       0    UavcanBatteryBridge::cbat_sub_cb()
   +67%     +16  [ = ]       0    __hrt_call_enter_veneer
 -34.0%     -16  [ = ]       0    __nxsched_merge_pending_veneer
  +2.5%     +95  [ = ]       0    uavcan::GenericSubscriber<>
  +2.5%    +114  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder
  +2.5%    +159  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::handleIncomingTransfer()
  +2.5%    +345  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +2.5%    +104  [ = ]       0    uavcan::GenericSubscriber<>::checkInit()
  +3.4%    +140  [ = ]       0    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.5%    +288  [ = ]       0    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +1.8%    +132  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()
  +1.8%    +282  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()::entry
  +2.0%    +128  [ = ]       0    uavcan::MethodBinder<>::operator bool()
  +7.2%     +45  [ = ]       0    uavcan::ScalarCodec::decode<>()
  +3.1%    +146  [ = ]       0    uavcan::Subscriber<>
  +3.2%    +174  [ = ]       0    uavcan::Subscriber<>::handleReceivedDataStruct()
  +3.1%    +441  [ = ]       0    uavcan::Subscriber<>::~Subscriber()
+0.1%    +800  [ = ]       0    .symtab
  [NEW]     +48  [ = ]       0    UavcanBatteryBridge::cbat_sub_cb()
 -96.7%    +144  [ = ]       0    [2 Others]
   +67%     +32  [ = ]       0    __hrt_call_enter_veneer
   +50%     +16  [ = ]       0    __hrt_store_absolute_time_veneer
 -40.0%     -32  [ = ]       0    __nxsched_merge_pending_veneer
   +33%     +16  [ = ]       0    __sem_wait_veneer
 -25.0%     -16  [ = ]       0    __stm32_configxfrints_veneer
 -33.3%     -16  [ = ]       0    __stm32_ep0out_setup_veneer
  +7.4%     +32  [ = ]       0    uavcan::FloatSpec<>::decode()
  +2.7%     +32  [ = ]       0    uavcan::GenericSubscriber<>
  +2.7%     +32  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder
  +3.0%     +32  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::handleIncomingTransfer()
  +2.7%     +96  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +3.3%     +64  [ = ]       0    uavcan::GenericSubscriber<>::checkInit()
  +3.3%     +32  [ = ]       0    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.7%     +96  [ = ]       0    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +1.8%     +48  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()
  +1.8%     +64  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()::entry
  +1.4%     +16  [ = ]       0    uavcan::MethodBinder<>::operator bool()
  +7.1%     +32  [ = ]       0    uavcan::ScalarCodec::decode<>()
  +3.3%     +32  [ = ]       0    uavcan::Subscriber<>
 +21% +1.91Ki  [ = ]       0    [Unmapped]
+0.1% +60.2Ki  +0.1% +2.15Ki    TOTAL

px4_fmu-v6x [Total VM Diff: 2120 byte (0.11 %)]
    FILE SIZE        VM SIZE    
--------------  -------------- 
+0.1% +2.07Ki  +0.1% +2.07Ki    .text
  [NEW]    +656  [NEW]    +656    UavcanBatteryBridge::cbat_sub_cb()
   +14%    +640   +14%    +640    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.8%    +136  +2.8%    +136    uavcan::GenericSubscriber<>::checkInit()
  +1.6%    +128  +1.6%    +128    uavcan::GlobalDataTypeRegistry::registerDataType<>()
   +30%     +84   +30%     +84    UavcanBatteryBridge::init()
 -97.9%     +62 -97.9%     +62    [6 Others]
  +3.3%     +56  +3.3%     +56    uavcan::Subscriber<>::handleReceivedDataStruct()
  +2.2%     +54  +2.2%     +54    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +2.8%     +40  +2.8%     +40    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +3.2%     +38  +3.2%     +38    uavcan::Subscriber<>::~Subscriber()
  +7.8%     +36  +7.8%     +36    UavcanBatteryBridge::UavcanBatteryBridge()
  +6.7%     +32  +6.7%     +32    uavcan::ScalarCodec::decode<>()
  +5.2%     +28  +5.2%     +28    uavcan::FloatSpec<>::decode()
  +0.0%     +24  +0.0%     +24    [section .text]
  +2.7%     +24  +2.7%     +24    uavcan::GenericSubscriber<>::TransferForwarder
  +2.1%     +24  +2.1%     +24    uavcan::MethodBinder<>::operator bool()
  +6.8%     +20  +6.8%     +20    UavcanBatteryBridge::battery_aux_sub_cb()
  +0.0%     +20  +0.0%     +20    g_cromfs_image
  +2.7%     +20  +2.7%     +20    uavcan::GenericSubscriber<>
  +3.3%     +20  +3.3%     +20    uavcan::Subscriber<>
 -10.1%     -22 -10.1%     -22    uavcan::equipment::power::BatteryInfo_<>::decode()
+0.0%     +74  [ = ]       0    .debug_abbrev
+0.1%    +144  [ = ]       0    .debug_aranges
+0.1%    +536  [ = ]       0    .debug_frame
+0.1% +23.2Ki  [ = ]       0    .debug_info
+0.1% +4.22Ki  [ = ]       0    .debug_line
  [NEW]      +1  [ = ]       0    [Unmapped]
  +0.1% +4.22Ki  [ = ]       0    [section .debug_line]
+0.2% +5.31Ki  [ = ]       0    .debug_loclists
+0.1%    +808  [ = ]       0    .debug_rnglists
+0.5% +18.6Ki  [ = ]       0    .debug_str
+0.4%      +1  [ = ]       0    .shstrtab
+0.4% +2.64Ki  [ = ]       0    .strtab
  [NEW]    +110  [ = ]       0    UavcanBatteryBridge::cbat_sub_cb()
  +2.5%     +95  [ = ]       0    uavcan::GenericSubscriber<>
  +2.5%    +114  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder
  +2.5%    +159  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::handleIncomingTransfer()
  +2.5%    +345  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +2.5%    +104  [ = ]       0    uavcan::GenericSubscriber<>::checkInit()
  +3.4%    +140  [ = ]       0    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.5%    +288  [ = ]       0    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +1.8%    +132  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()
  +1.8%    +282  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()::entry
  +2.0%    +128  [ = ]       0    uavcan::MethodBinder<>::operator bool()
  +7.2%     +45  [ = ]       0    uavcan::ScalarCodec::decode<>()
  +3.1%    +146  [ = ]       0    uavcan::Subscriber<>
  +3.2%    +174  [ = ]       0    uavcan::Subscriber<>::handleReceivedDataStruct()
  +3.1%    +441  [ = ]       0    uavcan::Subscriber<>::~Subscriber()
+0.1%    +800  [ = ]       0    .symtab
  [NEW]     +48  [ = ]       0    UavcanBatteryBridge::cbat_sub_cb()
  +7.4%     +32  [ = ]       0    uavcan::FloatSpec<>::decode()
  +2.7%     +32  [ = ]       0    uavcan::GenericSubscriber<>
  +2.7%     +32  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder
  +3.0%     +32  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::handleIncomingTransfer()
  +2.7%     +96  [ = ]       0    uavcan::GenericSubscriber<>::TransferForwarder::~TransferForwarder()
  +3.3%     +64  [ = ]       0    uavcan::GenericSubscriber<>::checkInit()
  +3.3%     +32  [ = ]       0    uavcan::GenericSubscriber<>::handleIncomingTransfer()
  +2.7%     +96  [ = ]       0    uavcan::GenericSubscriber<>::~GenericSubscriber()
  +1.8%     +48  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()
  +1.8%     +64  [ = ]       0    uavcan::GlobalDataTypeRegistry::registerDataType<>()::entry
  +1.4%     +16  [ = ]       0    uavcan::MethodBinder<>::operator bool()
  +7.1%     +32  [ = ]       0    uavcan::ScalarCodec::decode<>()
  +3.3%     +32  [ = ]       0    uavcan::Subscriber<>
  +3.3%     +48  [ = ]       0    uavcan::Subscriber<>::handleReceivedDataStruct()
  +3.3%     +96  [ = ]       0    uavcan::Subscriber<>::~Subscriber()
 +50% +1.93Ki  [ = ]       0    [Unmapped]
+0.1% +60.3Ki  +0.1% +2.07Ki    TOTAL

Updated: 2025-06-25T14:23:26

- timestamp was 0 if uavcan::BatteryInfo was received before uavcan::BatteryInfoAux
- scale was not set as unknown (-1) even though it is since it's never updated
- time_remaining was not initialized correctly and could sometimes be 0
  unexpectedly which causes the drone to failsafe because there's reportedly no flight time left
@MaEtUgR
Copy link
Member Author

MaEtUgR commented Jun 25, 2025

Thanks to @sfuhrer 's review I was able to fix multiple mistakes in the original version:

  • Current and average current were reported negative
  • Discharged mAh were mistakenly converted Wh -> mAh even though the message already contains mAh
  • For the scale field I added the explicit float literal postfix .f
  • Adapted the time_remaining field calculation for positive current
  • Restructured a bit for readability

Here's the exact diff from https://github.com/PX4/PX4-Autopilot/compare/a5d609616d76c2fbc43aa6af6737ce7e434259ad..2b50feae877a9c227053be410fe5c8688cc5c0eb#diff-d80076ce90512824ec6432761dee8db1468f527072bc8eb0ab386ac42978ffd8R227
image

Copy link
Contributor

@sfuhrer sfuhrer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool that you could solve so many old issues in one go!

@MaEtUgR MaEtUgR merged commit bb6d43d into main Jun 25, 2025
69 checks passed
@MaEtUgR MaEtUgR deleted the maetugr/cbat branch June 25, 2025 19:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants